package com.lyy.polymorphic.polyarr;


/**
 * @Author: GZQ
 * @date: 2024/11/19 23:06
 * @description: 多态的应用 - 多态数组 (对需求进行测试)
 */

public class PolyArray {

    // 需求：
    /*
     * 数组的定义类型为父类类型，里面保存的实际元素类型为子类类型
     * 应用实例:
     * 现有一个继承结构如下：
     * 1. 要求创建 1 个 Person 对象、2 个 Student 对象和 2 个Teacher 对象,
     * 2. 统一放在数组中，并调用每个对象say 方法.
     * 应用实例升级：
     * 1. 如何调用子类特有的方法，比如 Teacher 有一个 teach , Student 有一个 study
     * 2. 怎么调用？
     * */
    public static void main(String[] args) {

        Person[] persons = new Person[5];
        persons[0] = new Person("jack", 20);
        persons[1] = new Student("mary", 18,100);
        persons[2] = new Student("tom", 24,30);
        persons[3] = new Teacher("scott", 30, 5000);
        persons[4] = new Teacher("noc", 40, 5000);

        // 循环遍历多态数组,调用say方法
        for (int i = 0; i < persons.length; i++) {
            // person[i] 编译类型是 Person, 运行类型是 根据实际情况，由jvm 来决定
            System.out.println(persons[i].say());   // 动态绑定机制
            //
            if (persons[i] instanceof Student) { // 判断persons[i] 的运行类型是不是 Student
                Student student = (Student) persons[i]; // 向下转型
                student.study();
                // 也可简写使用一条语句 ((Student)persons[i]).study();
            } else if (persons[i] instanceof Teacher) {
                Teacher teacher = (Teacher) persons[i];
                teacher.teach();
            } else if (persons[i] instanceof Person){
            } else {
                System.out.println("你的类型有误, 请检查...");
            }
        }
    }
}